package com.cskaoyan.javase.oop1._6this;

/**
 * this关键字
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 *
 * 实现：
 * 1. 在run成员方法中访问速度和颜色两个属性，调用该方法查看结果。
 * 2. 在run成员方法的形参列表中，添加一个局部变量speed，不修改方法体，调用该方法查看结果。
 *
 * 在需求2中,在方法中定义同名的局部变量形参后,调用方法,结果显式实参的速度.
 * 因为就近原则,优先匹配较近的局部变量
 *
 * 如果我就是想要访问同名的成员变量,咋办? 需要使用this关键字
 *
 * this关键字介绍:
 * 在java的一个类中的所有成员方法,它的形参列表中,都存在一个隐式的传参,指向当前对象,用this引用来接收:
 *      1.this本质是一个引用,该引用指向当前对象
 *      2.何为"当前对象"?
 *      成员方法如果调用一定会是对象(名)在调用,哪个对象来调用这个成员方法,它就是当前对象
 *
 * this引用指向当前对象,它的使用场景有以下:
 *      1.当成员方法的局部变量和成员变量同名时,可以用this点来区分,表示访问对象的成员变量
 *      2.既然this指向当前对象,那么就可以用this点直接访问成员变量和方法(但是this是隐含传参,在一般情况下,不需要写出来,可以省略)
 *      3.this在代码量比较庞大的时候,可以用来增加代码的可读性.因为用this点在成员方法中访问的变量或方法一定是成员变量/方法.
 *      4.未完待续,this很重要,作用很多.一定要搞清楚
 *
 * 正是因为成员方法当中隐含this传参,所以成员方法中访问其他成员变量和方法是合情合理的
 * 但是static方法当中没有this传参(它也没办法有this传参),它不能直接访问成员变量和方法
 * 问:
 *      static方法中如果想访问成员咋办?
 *      创建对象即可.
 *
 *
 *
 *
 * @since 17:11
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 创建Car对象
        Car c = new Car();
        System.out.println(c.color);
        // 这次方法调用,c就是当前对象
        c.run(100);
        // System.out.println(c);

        Car c2 = new Car();
        c2.speed = 1000;
        c2.run(200);
    }
}

class Car {
    char color = '黑';
    double speed;

    public void run(double speed) {
        System.out.println(color + "色的小汽车,以" + this.speed + "的速度嘟嘟嘟的跑!");
        // System.out.println(this);
        // this.speed
        test(10);
        System.out.println(this.color);
    }

    public void test() {
    }

    public void test(int a) {
    }

    public static void testStatic() {
        // static方法中没有this传参,所以直接访问成员是不行.如果实在想访问,需要创建对象
        Car c = new Car();
        System.out.println(c.color);
        c.test();
    }
}

